import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

import java.io.IOException;
import java.net.URISyntaxException;

public class 测试书本示例代码 {

    private String 执行(String 文件名, boolean 输出执行信息) throws IOException, URISyntaxException {
        // 1. 读文件
        var 源码 = Tools.读文件(Tools.getResourcePath(文件名));
        
        // 2. 汇编
        var 汇编器 = 字节码汇编器.汇编(源码);
        var 字节码输出 = 字节码汇编器.输出字节码(汇编器.字节码, 汇编器.取字节码尺寸());
        System.out.println("字节码:");
        System.out.println(字节码输出);

        // 3. 反汇编
        System.out.println("反汇编：");
        var 反汇编 = new 反汇编器(汇编器.字节码, 汇编器.取字节码尺寸(), 汇编器.常量池.toArray());
        反汇编.反汇编();
        System.out.println(反汇编.反汇编输出);

        // 4. 执行
        System.out.println("\n执行：");
        var 解释器 = new 解释器();
        解释器.输出执行信息 = 输出执行信息;
        解释器.加载(汇编器.字节码, 汇编器.取字节码尺寸(), 汇编器.常量池.toArray(), 汇编器.入口函数, 汇编器.数据尺寸);
        解释器.执行();

        var 输出 = 解释器.输出.toString();
        System.out.println(标蓝(输出));
        return 输出;
    }

    private static String 标蓝(String 文本) {
        return "\u001B[34m" + 文本 + "\u001B[0m";
    }
    
    @Test
    public void TestT1() throws IOException, URISyntaxException {
        var 结果 = 执行("t.rcode", true);
        Assert.assertEquals(结果, "9");
    }

    @Test
    public void TestT2() throws IOException, URISyntaxException {
        var 结果 = 执行("t2.rcode", true);
        Assert.assertEquals(结果, "0123456789");
    }

    @Test
    public void TestT3() throws IOException, URISyntaxException {
        var 结果 = 执行("t3.rcode", true);
        Assert.assertEquals(结果, "8");
    }

    @Test
    public void TestT4() throws IOException, URISyntaxException {
        var 结果 = 执行("t4.rcode", true);
        Assert.assertEquals(结果, "50");
    }

    @Test
    public void TestStruct() throws IOException, URISyntaxException {
        var 结果 = 执行("struct.rcode", true);
        Assert.assertEquals("1", 结果);
    }

    @Test
    public void TestLoop() throws IOException, URISyntaxException {
        var 结果 = 执行("loop.rcode", false);
        Assert.assertEquals("done", 结果);
    }
}
